package com.itheima.controller;

import com.itheima.pojo.User;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;

/*
    测试请求参数的接收
 */
@RestController
public class RequestController {
    // 简单参数的接收 就是直接接收
    // 原始方法 需要通过HttpServletRequest对象来手动获取数据
//    @RequestMapping("/simpleParam")
//    public String simpleParam(HttpServletRequest request){
//        // 获取对应名称的数据 获取的数据全都是String类型的 需要自己手动转换
//        String name = request.getParameter("name");
//        String ageStr = request.getParameter("age");
//        // 将String类型的数据转换成int类型
//        int age = Integer.parseInt(ageStr);
//        System.out.println(name + ":" + age);
//        return "OK";
//    }

//    // springboot方式 参数名与变量名相同，定义形参即可接收参数 （这个方法方便简单 并且不用手动进行数据类型转换）
//    @RequestMapping("/simpleParam")
//    public String simpleParam(String name, Integer age){
//        System.out.println(name + ":" + age);
//        return "OK";
//    }

    // 以上方法的前提是参数名与变量名一致 当不一致时就不会传入该参数 该位置的参数值为null
    // 当就是需要变量名与参数名不一致且可以接收数据则使用以下方法
    @RequestMapping("/simpleParam")
    // 使用@RequestParam注解将name的值绑定到userName上
    // 并且该注解有一个属性required 该属性默认值为true 就是这个参数的值必须传输否则会报错
    public String simpleParam(@RequestParam(name = "name") String userName, Integer age){
        System.out.println(userName + ":" + age);
        return "OK";
    }

    // 实体参数的接收 将接收的参数存放在一个实体对象中 实体对象中参数名要与变量名一致
    @RequestMapping("/simplePojo")
    public String simplePojo(User user){
        System.out.println(user);
        return "OK";
    }

    // 实体参数中也可以有实体参数 我们只需要使用实体名.变量名的形式
    @RequestMapping("/complexPojo")
    public String complexPojo(User user){
        System.out.println(user);
        return "OK";
    }

    // 数组集合参数的接收
    //（在前端传输过来的数据有时候有多个值即复选框的情况，这时候我们就应该使用数组来接收数据）
    // 默认情况下使用数组进行接收 参数名也要一致
    @RequestMapping("/arrayParam")
    public String arrayParam(String[] hobby){
        System.out.println(Arrays.toString(hobby));
        return "OK";
    }

    // 使用集合接收
    @RequestMapping("/listParam")
    // 使用@RequestParam注解来绑定参数关系使数据存放在一个集合中去，因为默认情况下接收多个数据是放在数组中的
    public String listParam(@RequestParam List<String> hobby){
        System.out.println(hobby);
        return "OK";
    }

    // 时间参数的接收
    @RequestMapping("/dateParam")
    // 使用@DateTimeFormat注解接收时间数据（并使用pattern规定时间的格式，表示前端将来传输的数据格式必须是这个格式）
    public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
        System.out.println(updateTime);
        return "OK";
    }

    // JSON参数的接收
    @RequestMapping("/jsonParam")
    // 使用@RequeatBody注解接收JSON格式的数据
    public String jsonParam(@RequestBody User user){
        System.out.println(user);
        return "OK";
    }

    // 路径参数的接收 就是在路径中写的参数
    @RequestMapping("/path/{id}") // 括号中的参数名必须与下面的参数名相同
    // 通过@PathVarible注解获取路径参数并绑定给定义的参数
    // 可以传递多个参数
    public String pathParam(@PathVariable Integer id){
        System.out.println(id);
        return "OK";
    }
}

